#include <string.h>
#include "cli_func.h"
#include <uip.h>
#include <uip_arp.h>

enum {GET = 0, SET};

break_t do_init(str_t* tp){
	strcpy(tp->resp,"\n-------------------------------------------");
	strcat(tp->resp,"\n-     TCC  -  UIP MULTIPLE APLICATION     -");
	strcat(tp->resp,"\n-------------------------------------------\n");
	return RET_OK;
}


break_t do_get_temperature(str_t* tp){
	char buff[20];
	DEBUG_CLI("do_get_temperature");
	strcpy(tp->resp,"em construcao");
	//tp->resp =  buff;
	return RET_OK;
}

break_t do_chat(str_t* tp){
	char buff[20], porta[20];
	int port;

	DEBUG_CLI("do_chat troca de mensagens entre usuarios.\n");
	port = atoi (tp->value);
	sprintf(buff, "Porta %d",port);
	DEBUG_CLI(buff);
	CHAT_PORT = port;
	chat_start();//chama com a porta definida que será usado no chat.

	while(global_chat_flag==1); //fica aqui ateh vir comando de quit pelo chat para sair.

	return RET_OK;
}


void set_IP(void){

	uip_ipaddr_t xIPAddr;
	char buff[40];

	uipIP_ADDR0 = vectorAddrIPv4[0];
	uipIP_ADDR1 = vectorAddrIPv4[1];
	uipIP_ADDR2 = vectorAddrIPv4[2];
	uipIP_ADDR3 = vectorAddrIPv4[3];

//	ethernet_init();
	DEBUG_CLI("\nconfig IP");

	uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
	uip_sethostaddr( xIPAddr );
	lcd_clr();
	lcd_goto(1,0);
	sprintf(buff,"IP %d.%d.%d.%d", uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3);
	lcd_string(buff);
}

char* get_IP(void){
	char buff[30];
	sprintf(buff,"%d.%d.%d.%d", uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3);
	return buff;
}

break_t do_MAC(str_t* tp){
	char buff[20];
	if(tp->tipo == SET)
		strcpy(tp->resp, "Apenas comando de GET.");
	else if (tp->tipo == GET){
		sprintf(buff, "%d:%d:%d:%d:%d:%d", uipMAC_ADDR0, uipMAC_ADDR1, uipMAC_ADDR2,uipMAC_ADDR3,
				uipMAC_ADDR4,uipMAC_ADDR5);
	}
	return RET_OK;
}

break_t do_IP(str_t* tp){
	char* buff="\0";
	char arq[20];
	char dest[30];

	DEBUG_CLI("Return IP address");

	if(tp->tipo == SET){	//tipo SET
		strcpy(arq,tp->value);
		if(strlen(arq)<=0) return RET_ERROR;
		buff = strtok(arq, " ,.");
		vectorAddrIPv4[0] = atoi(buff);
		buff = strtok(NULL, " ,.");
		vectorAddrIPv4[1] = atoi(buff);
		buff = strtok(NULL, " ,.");
		vectorAddrIPv4[2] = atoi(buff);
		buff = strtok(NULL, " ,.");
		vectorAddrIPv4[3] = atoi(buff);
		set_IP();
		sprintf(dest,"set to %d.%d.%d.%d",uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3);
		strcpy(tp->resp, dest);
		//tp->resp = dest;
	}
	else {	//get
		sprintf(dest,"%s", get_IP());
		strcpy(tp->resp, dest);
		DEBUG_CLI(tp->resp);
		//sprintf(tp->resp,"%s", get_IP());
	}
	return RET_OK;

}



void writeDataLcd(char* data, int col, int linha)
{
	char dest[20];
	lcd_clr();
	sprintf(dest,"Coluna: %d linha: %d",col, linha);
	DEBUG_CLI(dest);
	lcd_goto(linha, col);
	lcd_string(data);
}

break_t do_lcd(str_t* tp){
	char arq[40], msg[16];//16 é o maximo para a linh
	char* buff="\0";
	int posX = 0, posY = 0;

	DEBUG_CLI("do_lcd");
	if(tp->tipo == SET){	//tipo SET
			strcpy(arq,tp->value);
			if(strlen(arq)<=0) return RET_ERROR;
			buff = strtok(arq, ";"); //mensagem para aparecer no display
			strcpy(msg, buff);
			buff = strtok(NULL, " ,.");
			posX = atoi(buff);
			if (posX > 16 || posX < 0) return RET_ERROR;
			buff = strtok(NULL, " ,.");
			posY = atoi(buff);
			if (posY > 2 || posY < 0) return RET_ERROR;
			writeDataLcd(msg, posX, posY);
			strcpy(tp->resp,"Dados Escritos com sucesso.");
		}
		else {	//get
			strcpy(tp->resp, "Apenas comando de SET.");
			DEBUG_CLI(tp->resp);
			//sprintf(tp->resp,"%s", get_IP());
		}
		return RET_OK;
}


/*
 * Função tratadora das mensagens de saída do sistema.
 *
 * */
void out_data(char * data){
	if(OUT_UART) uart_puts(data);
	else if(OUT_TELNET) shell_output(data,"");
}


void set_Gateway(void){
	uip_ipaddr_t xIPAddr;

	DEBUG_CLI("config Gateway");
	uip_ipaddr( xIPAddr, uip_GAT0, uip_GAT1, uip_GAT2, uip_GAT3);
	uip_setdraddr(xIPAddr);
}

break_t do_gateway(str_t* tp){
	char* buff="\0";
	char arq[20];
	char dest[30];
	int end[4];

	DEBUG_CLI("Return Gateway");

	if(tp->tipo == SET){	//tipo SET
		strcpy(arq,tp->value);
		if(strlen(arq)<=0) return RET_ERROR;
		buff = strtok(arq, " ,.");
		uip_GAT0 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_GAT1 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_GAT2 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_GAT3 = atoi(buff);
		set_Gateway();
		sprintf(dest,"set to %d.%d.%d.%d",uip_GAT0, uip_GAT1, uip_GAT2, uip_GAT3);
		strcpy(tp->resp, dest);
		//tp->resp = dest;
	}
	else {	//get
		sprintf(dest,"%d.%d.%d.%d", uip_GAT0, uip_GAT1, uip_GAT2, uip_GAT3);
		strcpy(tp->resp, dest);
		DEBUG_CLI(tp->resp);
		//sprintf(tp->resp,"%s", get_IP());
	}
	return RET_OK;

}


void set_Mask(void){
	uip_ipaddr_t xIPAddr;

	DEBUG_CLI("config Mask");
	uip_ipaddr( xIPAddr, uip_Mask0, uip_Mask1, uip_Mask2, uip_Mask3);
	uip_setnetmask(xIPAddr);

}


break_t do_mask(str_t* tp){
	char* buff="\0";
	char arq[20];
	char dest[30];
	int end[4];

	DEBUG_CLI("Return Mask");

	if(tp->tipo == SET){	//tipo SET
		strcpy(arq,tp->value);
		if(strlen(arq)<=0) return RET_ERROR;
		buff = strtok(arq, " ,.");
		uip_Mask0 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_Mask1 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_Mask2 = atoi(buff);
		buff = strtok(NULL, " ,.");
		uip_Mask3 = atoi(buff);
		set_Gateway();
		sprintf(dest,"set to %d.%d.%d.%d", uip_Mask0, uip_Mask1, uip_Mask2, uip_Mask3);
		strcpy(tp->resp, dest);
		//tp->resp = dest;
	}
	else {	//get
		sprintf(dest,"%d.%d.%d.%d", uip_Mask0, uip_Mask1, uip_Mask2, uip_Mask3);
		strcpy(tp->resp, dest);
		DEBUG_CLI(tp->resp);
		//sprintf(tp->resp,"%s", get_IP());
	}
	return RET_OK;

}


break_t do_configIp(str_t* tp){
	char* buff="\0";
	char arq[20];
	char dest[80];
	int end[4];

	DEBUG_CLI("Return network info");

	if(tp->tipo == SET){	//tipo SET
		sprintf(dest,"Just get command.");
		strcpy(tp->resp, dest);
		//tp->resp = dest;
	}
	else {	//get
		sprintf(arq,"\nMask: %d.%d.%d.%d", uip_Mask0, uip_Mask1, uip_Mask2, uip_Mask3);
		strcpy(dest, arq);
		sprintf(arq,"\nGateway: %d.%d.%d.%d", uip_GAT0, uip_GAT1, uip_GAT2, uip_GAT3);
		strcat(dest, arq);
		sprintf(dest,"\nIP:  %d.%d.%d.%d",uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3);
		strcat(dest, arq);
		strcpy(tp->resp, dest);
		DEBUG_CLI(tp->resp);
		//sprintf(tp->resp,"%s", get_IP());
	}
	return RET_OK;

}

